﻿using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Text.RegularExpressions;

namespace RegexLib.Web.Models.Web
{
	/// <summary>
	/// 为字符串提供辅助操作。
	/// </summary>
	public static class RxStringUtility
	{
		/// <summary>
		/// 判断一个字符串是否为合法的Email地址。
		/// </summary>
		/// <param name="str">待验证的字符串。</param>
		/// <returns>表示字符串<see cref="str"/>是否为有效的Email地址。</returns>
		public static bool IsEmail(this string str)
		{
			return RxRegexUtility.EmailRegex.IsMatch(str);
		}

		/// <summary>
		/// 判断一个字符串是否为合法的GUID。
		/// </summary>
		/// <param name="str"></param>
		/// <returns></returns>
		public static bool IsGuid(this string str)
		{
			return RxRegexUtility.GuidRegex.IsMatch(str);
		}

		/// <summary>
		/// 判断一个字符串是否为合法的AccessKey。
		/// </summary>
		/// <param name="str"></param>
		/// <returns></returns>
		public static bool IsAccessKey(this string str)
		{
			return RxRegexUtility.AccessKeyRegex.IsMatch(str);
		}

		/// <summary>
		/// 限制字符串的长度，多余部分用省略号“…”代替。
		/// </summary>
		/// <param name="str"></param>
		/// <param name="maxLength">最大长度。返回的字符串不会超过这个长度。</param>
		/// <returns></returns>
		public static string LimitLength(this string str, int maxLength)
		{
			return LimitLength(str, maxLength, "…");
		}

		/// <summary>
		/// 限制字符串的长度，多余部分用指定的省略号字符代替。
		/// </summary>
		/// <param name="str"></param>
		/// <param name="maxLength">最大长度。返回的字符串不会超过这个长度。</param>
		/// <param name="ellipsis">用以替代多余部分的省略号。</param>
		/// <returns></returns>
		public static string LimitLength(this string str, int maxLength, string ellipsis)
		{
			if (str == null)
				throw new ArgumentNullException("str");

			if (ellipsis.Length >= maxLength)
				throw new ArgumentException("省略号的长度应小于最大长度。");

			if (str.Length <= maxLength)
				return str;

			string ret = str.Substring(0, maxLength - ellipsis.Length);

			return ret + ellipsis;
		}

		/// <summary>
		/// 消除字符串数组中的重复内容。
		/// </summary>
		/// <param name="items">待移除重复元素的数组。</param>
		/// <returns>移除了重复元素之后的数组。</returns>
		public static string[] RemoveDuplicateItems(this string[] items)
		{
			return items.Distinct().ToArray();
		}

		/// <summary>
		/// 对字符串数组的元素：
		/// 截去首尾空白、消除空字符串、消除重复项。
		/// </summary>
		/// <param name="items"></param>
		/// <returns></returns>
		public static string[] TrimAndRemoveEmpty(this string[] items)
		{
			return items.Where(s => s.Trim().Length > 0).Select(s => s.Trim()).Distinct().ToArray();
		}
	}

	/// <summary>
	/// 提供常用的正则表达式。
	/// </summary>
	public class RxRegexUtility
	{
		/// <summary>
		/// 用于验证Email的正则表达式模式。
		/// </summary>
		public const string EmailPattern = @"^\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$";

		/// <summary>
		/// 用于验证Email的正则表达式。
		/// </summary>
		public static readonly Regex EmailRegex = new Regex(EmailPattern, RegexOptions.Compiled);

		/// <summary>
		/// 用于验证用户和正则表达式页面路径的正则表达式模式。
		/// </summary>
		public const string AccessKeyPattern = @"^[a-z0-9]+(?:-?[a-z0-9]+)*$";

		/// <summary>
		/// 用于验证用户和正则表达式页面路径的正则表达式。
		/// </summary>
		public static readonly Regex AccessKeyRegex = new Regex(AccessKeyPattern, RegexOptions.Compiled);

		/// <summary>
		/// 用于验证GUID的正则表达式模式。
		/// </summary>
		public const string GuidPattern = @"^[A-Fa-f0-9]{32}$|(?:{|\()?[A-Fa-f0-9]{8}-(?:[A-Fa-f0-9]{4}-){3}[A-Fa-f0-9]{12}(?:}|\))?$|^({)?[0xA-Fa-f0-9]{3,10}(, {0,1}[0xA-Fa-f0-9]{3,6}){2}, {0,1}({)([0xA-Fa-f0-9]{3,4}, {0,1}){7}[0xA-Fa-f0-9]{3,4}(}})$";

		/// <summary>
		/// 用于验证GUID的正则表达式。
		/// </summary>
		public static readonly Regex GuidRegex = new Regex(GuidPattern, RegexOptions.Compiled);
	}
}
